﻿using System;
using System.Collections.Generic;
using System.Collections;
using System.Runtime.Serialization.Formatters.Binary;
using System.Linq;
using System.Text;
using Datos;

namespace Negocio
{
	[Serializable]
    public class Sistema
    {
        private List<Infraccion>  infracciones;
        private List<Propietario> propietarios;
        private List<Vehiculo>    vehiculos;
        private List<String>      tipoInfracciones;
        
        public Sistema()
        {
        	propietarios = new List<Propietario>();
        	infracciones = new List<Infraccion>();
        	vehiculos    = new List<Vehiculo>();
        	tipoInfracciones = new List<String>();       
        }
        
        public bool chequearInfraccion(Infraccion infra)
        {
        	bool flag=false;
        	foreach(Infraccion i in infracciones)
        		if(infra.Codigo == i.Codigo)
        			flag=true;
        	if(flag==true)
        		return false;
        	else
        		return true;
        }
        public bool chequearPropietario(Propietario prop)
        {
        	bool flag=false;
        	foreach(Propietario p in this.cargarPropietariosDesdeBase()) {
        		if(prop.Dni.Equals(p.Dni)) {
        			flag=true;
        		}
        	}
        		
            return flag;
        }
        
        public bool chequearVehiculo(Vehiculo ve)
        {
        	bool flag=false;
        	foreach(Vehiculo v in this.cargarVehiculoDesdeBase()) {
        		if(ve.Dominio.Equals(v.Dominio)) {
        			flag=true;        			
        		}
        	}
        	
        	return flag;
        }
        

        public void agregarInfraccion(Infraccion infra)
        {
            infracciones.Add(infra);
        }

        public void agregarPropietario(Propietario propietario) {
        	this.propietarios.Add(propietario);
        }
        
        public void agregarVehiculo(Vehiculo vehiculo) {
        	this.vehiculos.Add(vehiculo);
        }
        
        public List<Propietario> ListaPropietarios {
        	get { return this.cargarPropietariosDesdeBase();}
        	set { propietarios = value; }
        }
        
        public List<Infraccion> ListaInfracciones {
        	get { return this.cargarInfraccionesDesdeBase(); }
        	set { infracciones = value;} 
        }
                                        
        public List<Vehiculo> ListaVehiculos {
        	get { return this.cargarVehiculoDesdeBase(); }
        }
        
        public List<String> ListaTipoInfracciones {
        	get { 
        		//if (this.tipoInfracciones == null) {
        			this.tipoInfracciones = new List<String>();
        			this.tipoInfracciones.Add("Grave");
        			this.tipoInfracciones.Add("Leve");
        		//}
        		
        		return tipoInfracciones;
        	}
        }

//        public void actualizarVehiculos(Infraccion infra) {
//        	foreach (Vehiculo vehi in this.ListaVehiculos) {
//        		int cantidad = vehi.ListaInfracciones.Count;
//        		
//        		for (int i = 0 ; i < cantidad ; i++) {
//        			Infraccion inf =  vehi.ListaInfracciones.ElementAt(i);
//        			
//        			if(inf.Codigo.Equals(infra.Codigo)) {
//        				inf = infra;
//        			}
//        		}
//        	}
//        }
        
        public static Sistema Recuperar()
        {
            Sistema sistema = (Sistema)Datos.Datos.Recuperar();
            if(sistema==null)
                sistema = new Sistema();
            return sistema;
        }

        public bool guardar()
        {
        	Boolean resultado = Datos.Datos.Guardar(this);
        	Console.WriteLine("El resultado dio : " + resultado );
            return resultado;
        }        
                
        private List<Vehiculo> obtenerVehiculos() {
        	vehiculos    = new List<Vehiculo>();
        	
        	foreach (Propietario prop in ListaPropietarios) {
        		foreach (Vehiculo vehi in prop.ListaVehiculos) {
        			vehiculos.Add(vehi);
        		}
        	}
        	
        	return vehiculos;
        }
        
    // NUEVOS MËTODOS
       private List<Infraccion> cargarInfraccionesDesdeBase()
        {
       		List<Infraccion> infraccionesTemp = new List<Infraccion>();
       	
            ArrayList datosInf;
            Datos.Datos d = new Datos.Datos();
            datosInf = d.obtenerInfracciones();
            int cod;
            string desc;
            int importe;
            int tipo;
            Infraccion inf;
            for (int i = 0; i < datosInf.Count; i = i + 4)
            {
                cod = (int)datosInf[i];
                desc = (string)datosInf[i + 1];
                importe = (int)datosInf[i + 2];
                tipo = (int)datosInf[i + 3];
				        
                if (tipo.Equals(1)) {
                	inf = new InfraccionGrave(desc,importe);
                }
                else {
                	inf = new InfraccionLeve(desc,importe);
                }
                
                inf.Codigo = cod;
                infraccionesTemp.Add(inf);
            }
            
            return infraccionesTemp;
        }

       private List<Propietario> cargarPropietariosDesdeBase()
        {
       		List<Propietario> propietariosTemp = new List<Propietario>();
       	
            ArrayList datosPro;
            Datos.Datos d = new Datos.Datos();            			
            datosPro = d.obtenerPropietarios();
            
            int id;
	        int dni;
	        String nombre;
	        String apellido;
	        String direccion;
            Propietario pro;
            for (int i = 0; i < datosPro.Count; i = i + 5)
            {
            	id = (int)datosPro[i];
                dni = (int)datosPro[i + 1];
                nombre = (string)datosPro[i + 2];
                apellido = (string)datosPro[i + 3];
                direccion = (string)datosPro[i + 4];
				                        
                pro = new Propietario(dni);
                pro.Id = id;
                pro.Apellido  = apellido;
                pro.Direccion = direccion;
                pro.Nombre    = nombre;
                
                propietariosTemp.Add(pro);
            }
            
            return propietariosTemp;
        }

       private List<Vehiculo> cargarVehiculoDesdeBase()
        {
       		List<Vehiculo> vehiculoTemp = new List<Vehiculo>();
       	
            ArrayList datosVeh;
            Datos.Datos d = new Datos.Datos();            			
            datosVeh = d.obtenerVehiculos();
            
            int id;
	        string dominio;
        	string marca;
        	int modelo;
        	int propietarioId;
            
        	Vehiculo veh;
            for (int i = 0; i < datosVeh.Count; i = i + 5)
            {
        		id = (int)datosVeh[i];
                dominio = (string)datosVeh[i + 1];
                marca = (string)datosVeh[i + 2];
                modelo = (int)datosVeh[i + 3];
                propietarioId = (int)datosVeh[i + 4];
				                        
                veh = new Vehiculo(dominio,new Propietario(propietarioId));
                veh.Id = id;
                veh.Marca = marca;
                veh.Modelo = modelo;
                
                vehiculoTemp.Add(veh);
            }
            
            return vehiculoTemp;
        }
        
//        private List<Infraccion> obtenerInfracciones() {
//        	infracciones = new List<Infraccion>();
//        	
//        	foreach (Vehiculo vehi in ListaVehiculos) {
//        		foreach (Infraccion infra in vehi.ListaInfracciones) {
//        			infracciones.Add(infra);
//        		}
//        	}
//        	
//        	return infracciones;
//        }
        
    }
    
       
}
